enum IdCardField {
  BirthDate = 1, // 出生日期
  Age = 2, // 年龄
  Gender = 3, // 性别
  BirthPlace = 4, // 出生地
  Year = 5, // 出生年份
  Month = 6, // 出生月份
  Day = 7 // 出生日期
}

function ID_CARD_INFO(idCard: string, type: IdCardField): string | number {
  // 校验身份证格式（18位）
  const regExp = /^\d{17}(\d|X|x)$/;
  if (!regExp.test(idCard)) {
    throw new Error("无效的身份证号码");
  }

  // 提取出生日期（身份证第7到14位是出生日期，格式为 YYYYMMDD）
  const birthDate = idCard.slice(6, 14);
  const year = parseInt(birthDate.slice(0, 4), 10);
  const month = parseInt(birthDate.slice(4, 6), 10);
  const day = parseInt(birthDate.slice(6, 8), 10);
  const birth = new Date(year, month - 1, day); // 注意：月份从0开始，所以要减去1

  // 计算年龄
  const today = new Date();
  let age = today.getFullYear() - year;
  if (today.getMonth() + 1 < month || (today.getMonth() + 1 === month && today.getDate() < day)) {
    age--; // 如果今年生日还没过，年龄要减1
  }

  // 提取性别（身份证的第17位：偶数为女性，奇数为男性）
  const gender = parseInt(idCard.charAt(16), 10) % 2 === 0 ? 2 : 1; // 1: 男, 2: 女

  // 提取出生地（身份证的前6位为出生地代码）
  const birthPlace = parseInt(idCard.slice(0, 6), 10);

  // 根据type返回对应值
  switch (type) {
    case IdCardField.BirthDate: // 出生日期
      return birth.toISOString().split("T")[0]; // 返回 YYYY-MM-DD 格式的生日
    case IdCardField.Age: // 年龄
      return age;
    case IdCardField.Gender: // 性别
      return gender;
    case IdCardField.BirthPlace: // 出生地
      return birthPlace;
    case IdCardField.Year: // 出生年份
      return year;
    case IdCardField.Month: // 出生月份
      return month;
    case IdCardField.Day: // 出生日期（具体日）
      return day;
    default:
      throw new Error("无效的type类型");
  }
}

function testFun() {
  return 1;
}

export { ID_CARD_INFO, testFun };
